Boite à outils 1 :
La première étape de ce projet a pour objectif d’extraire les contenus des
titres et descriptions des fils RSS du Monde. Ces derniers sont sous
format XML, un langage de structuration des données ayant recours à des
balises.
Comme tous les fichiers XML ne sont pas sur le même modèle, il nous faut
la fonction chomp et une concaténation pour les mettre sur le même format
(pour la version avec les expressions régulières, appelées aussi regex).
Une fois les contenus textuels récupérés, nous filtrons les éventuels
doublons à l’aide de tables de hashage (%dictionnairedesfils et
%dictionnairedescription) et nous appliquons une procédure de nettoyage
qui remplace les caractères spéciaux et les problèmes d’encodage comme les
oe et les diacrités (ex : $chainetrouvee=~s /\x{0153}/oe/g; ). Le $titre
ou le $description courant est envoyé à la procédure nettoyage puis
enregistré dans une variable du même nom une fois « propre ».
$description=&nettoyage($description);
$titre=&nettoyage($titre);
Afin de traiter le dossier 2014 sur sa totalité, nous avons incrémenté nos
programmes d’une procédure de parcours d’arborescence, qui reconstruit le
chemin jusqu’à un premier fichier xml, extrait et nettoie ses contenus,
puis remonte dans l’arborescence pour recommencer sur un autre. Les étapes
détaillées de cette procédure sont les suivantes :
• On crée une variable $path qui contiendra le premier
élément de la liste @_, qui correspond, au début, au chemin du répertoire
entré,
• On ouvre ce répertoire entré en argument,
• On crée une liste @files qui correspond à l’ensemble
des éléments contenus dans le répertoire qui sont lus grâce à la fonction
readdir,
• On ferme ce répertoire,
• Pour chaque élément de la liste @files, on passe
directement au suivant s'il est égal à 1 ou plusieurs points (syntaxe
UNIX),
• Si ce n’est pas le cas, on reconstruit le chemin
atteint jusqu’ici, soit le nom du répertoire entré / nom du premier
élément utilisable en découlant. Le programme reconstitue ainsi le chemin
par rapport à notre emplacement,
• Chaque fois la question suivante est posée par le
programme : ai-je affaire à un répertoire (-d) ou un fichier (-f) ? S’il
s’agit d’un répertoire, je relance le parcours de l’arborescence depuis le
chemin établit jusqu’ici, sinon j’ouvre et je traite le fichier puis je
recommence pour un autre fichier et un autre dossier, etc..
A la suite de quoi, il faut faire un test pour s’assurer que le fichier
n’est pas vide :
if ((-s $file !=0))
Nous avons donc conçu deux programmes différents pour cela, un à base
d’expressions régulières et l’autre à l’aide du module perl XML::RSS. Ce
module reconstruit à partir du fichier xml, un nouveau scalaire qui se
présente sous la forme d’un tableau associatif [
capture].
Les clés du tableau correspondent aux balises du fichier xml et les
valeurs à leurs contenus. Nous pouvons alors récupérer tous les titres et
descriptions de la liste des items à l’aide de $item->{‘description’}.
Le programme écrit à partir des expressions régulières va chercher les
lignes correspondantes à l’expression et enregistrer dans les variables $1
et $2 les contenus recherchés (pour ce faire, il récupère la partie qui
est entre parenthèses dans notre expression régulière [
capture]).
Les fichiers du dossier 2014 sont encodés en utf-8 mais pour d’autres
données où ça ne serait pas le cas, la détection de l’encodage est
nécessaire. On peut le trouver soit avec la commande file –i, soit avec
une expression régulière.
Pour supprimer les doublons, nous vérifions avec un test if que le $titre
ou le $description traité n’existe pas déjà dans les tables de hashage
respectives. Si ils n’y sont pas, alors on les incrémente :
if (!(exists($dictionnairedesfils{$titre})) and
!(exists($dictionnairedescription{$description})))
{
$dictionnairedesfils{$titre}++;
$dictionnairedescription{$description}++;
Enfin l’impression des contenus pour le texte brut est faite en imprimant
d’abord le titre, saut à la ligne, la description et § pour délimiter un
article. Pour le xml, on ajoute une première balise <item> pour
chaque article et des balises <title> ou <description> autour
de la variable correspondante.
print OUT1
"<item><title>$titre</title>\n<description>$description</description>\n</item>\n";
script de la BaO1 avec XML::RSS
script de la BaO1 avec regex